#define RV32_BYTE 4

    .section      .text.entry
    .align 2
    .global trap_entry

trap_entry:
/*
## check whether can enter ISR
## set led
    lui  a5,0x10000
    li      s0,1
    sh      s0,0(a5)   #GPIO_ODR=0x10000000
## dead_loop
    j .
*/
	addi sp, sp, -16*RV32_BYTE
    sw x1 , 0*RV32_BYTE(sp)
    sw x5 , 1*RV32_BYTE(sp)
    sw x6 , 2*RV32_BYTE(sp)
    sw x7 , 3*RV32_BYTE(sp)
    sw x10, 4*RV32_BYTE(sp)
    sw x11, 5*RV32_BYTE(sp)
    sw x12, 6*RV32_BYTE(sp)
    sw x13, 7*RV32_BYTE(sp)
    sw x14, 8*RV32_BYTE(sp)
    sw x15, 9*RV32_BYTE(sp)
    sw x16, 10*RV32_BYTE(sp)
    sw x17, 11*RV32_BYTE(sp)
    sw x28, 12*RV32_BYTE(sp)
    sw x29, 13*RV32_BYTE(sp)
    sw x30, 14*RV32_BYTE(sp)
    sw x31, 15*RV32_BYTE(sp)

    csrr a0, mcause /*中断原因写入a0*/
    csrr a1, mepc   /*返回地址写入a1*/

    call trap_handler  /*中断处理函数*/

    /*恢复现场并返回*/
    lw x1 , 0*RV32_BYTE(sp)
    lw x5 , 1*RV32_BYTE(sp)
    lw x6 , 2*RV32_BYTE(sp)
    lw x7 , 3*RV32_BYTE(sp)
    lw x10, 4*RV32_BYTE(sp)
    lw x11, 5*RV32_BYTE(sp)
    lw x12, 6*RV32_BYTE(sp)
    lw x13, 7*RV32_BYTE(sp)
    lw x14, 8*RV32_BYTE(sp)
    lw x15, 9*RV32_BYTE(sp)
    lw x16, 10*RV32_BYTE(sp)
    lw x17, 11*RV32_BYTE(sp)
    lw x28, 12*RV32_BYTE(sp)
    lw x29, 13*RV32_BYTE(sp)
    lw x30, 14*RV32_BYTE(sp)
    lw x31, 15*RV32_BYTE(sp)

	addi sp, sp, 16*RV32_BYTE
    mret  /*中断返回*/


.weak trap_handler /*若没有定义中断处理函数*/
trap_handler:
1:
    j 1b /*死循环*/
